<?php

namespace app\job;

use app\admin\controller\vip\Code;
use app\admin\model\Scenic;
use ba\Exception;
use ba\ScenicApi;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use think\facade\Log;
use think\queue\Job;

class Export
{
    /**
     * 队列名称
     */
    public static string $queue = 'export';

    /**
     * 最大重试次数
     */
    protected int $maxAttempts = 3;

    /**
     * 处理队列任务
     *
     * @param Job $job 队列任务
     * @param array $data 任务数据
     * @return void
     */
    public function fire(Job $job, $data)
    {
        try {
            // 获取导出ID
            $export_id = $data['id'] ?? 0;
            if (!$export_id) {
                Log::error('导出任务缺少ID参数');
                $job->delete();
                return;
            }

            // 获取导出记录
            $export = (new \app\admin\model\Export())->where(['id' => $export_id])->findOrEmpty();
            if ($export->isEmpty()) {
                Log::warning("导出任务ID[{$export_id}]不存在");
                $job->delete();
                return;
            }

            // 更新状态为处理中
            if ($export->status != 1) {
                $export->status = 1;
                $export->save();
            }

            // 根据导出类型执行相应的导出方法
            $result = false;
            if ($export->type == 1) {
                $result = (new \app\admin\model\Export())->exportCode($export);
            }
            if (!$result) {
                throw new Exception('导出失败');
            }
            // 任务完成，删除队列
            $job->delete();

        } catch (Exception $e) {
            // 记录错误日志
            Log::error('导出任务异常: ' . $e->getMessage());

            // 检查重试次数
            if ($job->attempts() >= $this->maxAttempts) {
                // 达到最大重试次数，更新导出状态为失败
                if (isset($export) && !$export->isEmpty()) {
                    $export->status = 3; // 失败状态
                    $export->error_info = $e->getMessage();
                    $export->save();
                }

                // 结束任务
                $job->delete();
            } else {
                // 重试任务
                $job->release(60); // 60秒后重试
            }
        }
    }


}
